/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package be.hogent.iii.project.connectie;

import be.hogent.iii.project.testserialisatie.*;
import be.hogent.iii.project.dummy.DummySpel;
import be.hogent.iii.project.objects.Spel;
import be.hogent.iii.project.objects.Speler;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.NotSerializableException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Dieter Van der Stock
 */
public class TestSerialisatieEnCodering {

    /**
     * We gaan uittesten of we serialisatie kunnen laten werken, eerst en vooral lokaal
     * Tweede instantie: met base64 encodering en decodering
     * 
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException, ClassNotFoundException  {
        // TODO code application logic here
        
        /* SPEL UITSCHRIJVEN NAAR C:\School\spel.dat */
        System.out.println("\nWe maken een spel en steken er testdata in, namelijk 3 spelers met onze nicknames");
        DummySpel dummySpel = new DummySpel();
        //wat testdata erin steken zoals namen van spelers (originele dummydata overschrijven)
        ArrayList spelers = new ArrayList<Speler>();
        Speler speler1 = new Speler(1);
        Speler speler2 = new Speler(2);
        Speler speler3 = new Speler(3);
        speler1.setNick("Anquilas");
        speler2.setNick("Jefke");
        speler3.setNick("Caribou");
        spelers.add(speler1);
        spelers.add(speler2);
        spelers.add(speler3);
        
        Spel spel = dummySpel.getSpel();
        spel.setDeelnemers(spelers);
       
        System.out.println("Testdata aangemaakt, we openen de stream en schrijven dummyspel weg naar C:\\school\\spel.dat");
        ObjectOutputStream outStream = new ObjectOutputStream(new FileOutputStream("C:\\School\\spel.dat"));
        
        try {
        outStream.writeObject(dummySpel);
        }
        catch(NotSerializableException nte) {
            System.out.println("FOUT: Niet serialiseerbaar");
            nte.printStackTrace();
        }
        
        outStream.close();
        
        
        /* SPEL INLADEN VAN  C:\School\spel.dat */
        System.out.println("\nSuccesvol weggeschreven, nu openen we een inputstream om de data in te lezen");
        ObjectInputStream inStream = new ObjectInputStream(new FileInputStream("C:\\School\\spel.dat"));
        DummySpel gelezen = (DummySpel)inStream.readObject();
        
        //even testen of we wel degelijk waardes kunnen uitlezen ed
        Spel nieuwSpel = gelezen.getSpel();
        List spelers2 = nieuwSpel.getDeelnemers();
        System.out.println("Aantal spelers opgehaald spel: " + spelers2.size());
        Iterator it = spelers.iterator();
        System.out.println("Spelers: " + spelers2.toString());
        while (it.hasNext()) {
            Speler s = (Speler)it.next();
            System.out.println("Speler: " + s.getNick());
        }
        
        inStream.close();
        
        
        /* nu gaan we eens zien of we het file kunnen omzetten van binair naar base64 en dan terug omgekeerd
        om dan te kijken of we nog altijd kunnen deserialiseren */
        System.out.println("\n\nWe proberen een stream om te zetten in een string met base64");
        //ObjectInputStream byteStream = new ObjectInputStream(new FileInputStream("C:\\School\\spel.dat"));
        
        File file = new File("C:\\School\\spel.dat");
        byte[] byteArray = getBytesFromFile(file);
        //int aantalBytes = inStream.read(byteArray);
        //System.out.println("Aantal bytes gelezen: " + aantalBytes);
        //System.out.println("De bytes: " + byteArray.toString() );
        System.out.println("bytearray ingelezen, nu encoderen met base64 tot een string");
        
        //Base64 encoder = new Base64();
        String base64String = Base64.encode(byteArray);
        System.out.println("\nbyteStream gecodeerd tot string, zijnde: " + base64String);
        
        System.out.println("\nNu proberen we deze string te decoderen en terug tot een file te maken");
        byte[] decoded = Base64.decode(base64String);
        FileOutputStream nieuwStream = new FileOutputStream("C:\\School\\spel2.dat");
        nieuwStream.write(decoded);
        System.out.println("Gedecodeerde bytes naar file C:\\School\\spel.dat geschreven, nu proberen uitlezen");
        
        //even testen of we wel degelijk waardes kunnen uitlezen ed
        ObjectInputStream inStream2 = new ObjectInputStream(new FileInputStream("C:\\School\\spel2.dat"));
        DummySpel gelezen2 = (DummySpel)inStream2.readObject();
        Spel nieuwSpel2 = gelezen.getSpel();
        List nieuweSpelers = nieuwSpel.getDeelnemers();
        System.out.println("Aantal spelers nieuw opgehaald spel na base64: " + spelers2.size());
        Iterator it2 = spelers.iterator();
        System.out.println("Spelers: " + spelers2.toString());
        while (it2.hasNext()) {
            Speler s = (Speler)it2.next();
            System.out.println("Speler: " + s.getNick());
        }
        
        
        
        System.out.println("\nTest succesvol afgelopen. Programma wordt gesloten.");
    }
    
     // Returns the contents of the file in a byte array.
    public static byte[] getBytesFromFile(File file) throws IOException {
        InputStream is = new FileInputStream(file);
    
        // Get the size of the file
        long length = file.length();
    
        // You cannot create an array using a long type.
        // It needs to be an int type.
        // Before converting to an int type, check
        // to ensure that file is not larger than Integer.MAX_VALUE.
        if (length > Integer.MAX_VALUE) {
            // File is too large
        }
    
        // Create the byte array to hold the data
        byte[] bytes = new byte[(int)length];
    
        // Read in the bytes
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length
               && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
            offset += numRead;
        }
    
        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read file "+file.getName());
        }
    
        // Close the input stream and return bytes
        is.close();
        return bytes;
    }
}
